package threadLock.arrayListThread;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 线程安全的ArrayList 修改操作都是在底层复制一个数组进行的
 * 每一次操作都有ReentrantLook锁来控制线程 确保线程的安全性
 * api与普通的list集合一样
 * 演示弱一致性的迭代器
 */
public class CopyOnWriteArrayListTest {
    private static volatile List<String> strings = new CopyOnWriteArrayList<>();

    /**
     * main线程中开启子线程 修改删除当前线程中的元素 但是输出的元素却并没有被修改
     * 获取迭代器必须在子线程执行之前才能看到这个现象
     */
    public static void main(String[] args) throws InterruptedException {
        strings.add("hello");
        strings.add("alibaba");
        strings.add("welcome");
        strings.add("to");
        strings.add("北京");
        Thread thread = new Thread(() -> {
            strings.set(1,"stream");
            strings.remove(2);
            strings.remove(3);
        });
        Iterator<String> iterator = strings.iterator();
        thread.start();
        thread.join();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
